package com.wgy.day39.反射.Class对象功能;

import com.wgy.day39.domain.Person;

import java.lang.reflect.Field;

/**
 * Created by pc on 2020/12/15 20:42
 * Description: LearningJava
 */
/*
Class对象功能:之获取功能

1.获取成员变量们(Field)
   Field[] getFields():获取所有public修饰的成员变量
   Field[] getField(String name):获取指定名称的public修饰的成员变量
   Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
   Field[] getDeclaredField(String name):获取指定的成员变量,不考虑修饰符

   获取到的field后的操作:(成员变量)
                  获取成员变量值:get(Object obj)
                  设置成员变量值:set(Object obj,Object value)
       忽略访问权限修饰符的安全检查:setAccessible(true):暴力反射



2.获取构造方法们(Constructor)
   Constructor<?>[] getConstructors():
   Constructor<T>[] getConstructor(类<?>...parameterTypes):
   Constructor<T>[] getDeclaredConstructors():
   Constructor<T>[] getDeclaredConstructor(类<?>...parameterTypes):

3.获取成员方法们(Method)
   Method[] getMethods():
   Method[] getMethod(String name,类<?>...parameterTypes):
   Method[] getDeclaredMethods():
   Method[] getDeclaredMethods(String name,类<?>...parameterTypes):

4.获取类名
   String getName():
*/
public class Demo02Reflect_Field {
    public static void main(String[] args) throws Exception {
        //1.获取Person类的Class对象
        Class personClass = Person.class;
        //2.通过Class对象获取成员变量
        Field[] fields = personClass.getFields();
        //3.遍历成员变量数组 结果是空的  因为这个方法只能获取到public修饰的成员变量  person类没有public修饰的成员变量所以数组为空
        //再给Person类定义几个不同修饰符修饰的成员变量后 就可以获取到值了
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("==========");

       //获取指定名称的public修饰的成员变量
        Field a = personClass.getField("a");
        System.out.println(a);

        //获取a成员变量的值
        Person p=new Person();
        Object value = a.get(p);
        System.out.println(value);//null  public String a;

        //设置a的值
        a.set(p,"北京");
        System.out.println(p);
        System.out.println("=============");

       //Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
  /*private java.lang.String com.wgy.day39.domain.Person.name
   private int com.wgy.day39.domain.Person.age
   public java.lang.String com.wgy.day39.domain.Person.a
   protected java.lang.String com.wgy.day39.domain.Person.b
      java.lang.String com.wgy.day39.domain.Person.c
   private java.lang.String com.wgy.day39.domain.Person.d
*/
  //访问私有的成员变量 要忽略访问权限修饰符的安全检查
        Field d = personClass.getDeclaredField("d");
        // 要忽略访问权限修饰符的安全检查
        d.setAccessible(true);//暴力反射
        Object value1 = d.get(p);
        System.out.println(value1);//null


    }
}
